iT邦幫忙

DAY 15
0

從想法到快速實作的捷徑:Rails系列 第 15

[ Day 15 ][ Dev ] 使用者認證機制 - Devise

  • 分享至 

  • xImage
  •  

現在我們已經有了po文的CRUD功能,

不過如果隨便一個阿貓阿狗來都可以改變po文,或者是無法追蹤使用者的話,

那這樣就變得一點意義都沒有啦!

我們可以用手刻出user的功能來,

不過在動手做東西之前記得先google一下有沒有人已經幫你做了類似的事情了。

" Don't Repeat Yourself "

記得嗎?

這時候就會找到devise這個gem了,

實作使用者機制會變成一件再輕鬆不過的事情。

(不過記得多去閱讀它的document,不要把方便當隨便了)

很多地方可以點進去wiki看,會發現許多客製化的功能已經有人幫你先做好了,

這時候我們需要的只是去閱讀文件,使用它,打完收工!

  • 第一步還是一樣先在Gemfile裡面加入devise

    gem "devise"

  • rails generate devise:install照著readme裡面做

  • 會看到一大篇guide告訴你一些config的事情,看完如果沒要更改就可以繼續進行下一步,記得在application.html.erb加入flash messages,待會測試的時候才會知道自己到底登入了沒有

    <% if notice %>

  • rails generate devise user: 這裡不一定要用user,可以用任何你喜歡的單字,像是:member

  • 再來magic就發生了,稍微看一下terminal上devise幫我們做了哪些事情

  • 打開migrate看一看他新建的user table裡面有哪些欄位,會發現有些還沒有用到的他也幫我們先加好了,不過這裡要加上t.string :name,因為devise預設不會幫我們生這個欄位

  • 沒問題就bundle exec rake db:migrate

  • 再來執行rake routes看一下,多出了這一大串東西

    ➜ united_issues git:(devise) ✗ be rake routes
    Prefix Verb URI Pattern Controller#Action
    new_user_session GET /users/sign_in(.:format) devise/sessions#new
    user_session POST /users/sign_in(.:format) devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
    user_password POST /users/password(.:format) devise/passwords#create
    new_user_password GET /users/password/new(.:format) devise/passwords#new
    edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
    PATCH /users/password(.:format) devise/passwords#update
    PUT /users/password(.:format) devise/passwords#update
    cancel_user_registration GET /users/cancel(.:format) devise/registrations#cancel
    user_registration POST /users(.:format) devise/registrations#create
    new_user_registration GET /users/sign_up(.:format) devise/registrations#new
    edit_user_registration GET /users/edit(.:format) devise/registrations#edit
    PATCH /users(.:format) devise/registrations#update
    PUT /users(.:format) devise/registrations#update
    DELETE /users(.:format) devise/registrations#destroy

再來就直接在application.html.erb加上登入和註冊的連結吧!

(所有頁面共通的東西可以放在這裡。)

記得登出是delete method,如果沒有session的概念可以先這樣記著就好

<nav>
  <%= link_to "註冊", new_user_registration_path %>
  <%= link_to "登入", new_user_session_path %>
  <%= link_to "登出", destroy_user_session_path, method: :delete %>
</nav>

我們希望登入後才能看到登出這個連結,這裡devise也幫我們準備好helper method來做這件事情。

<nav>
   <% unless user_signed_in? %>
    <%= link_to "註冊", new_user_registration_path %>
    <%= link_to "登入", new_user_session_path %>  
   <% end %> 
  <% if user_signed_in? %>
    <%= link_to "登出", destroy_user_session_path, method: :delete %>
  <% end %>
</nav>

也許之後還會有更聰明的方法來解決,不過我們可以先把這支nav bar抽出來做成partial

再來是剛剛新增過的name欄位,我們得在registration/new.html.erb裡面加上去,

要客製化view的話得先執行rails generate devise:views

這裡也可以用rails generate devise:views user,不過這樣的話就要重調controller,
會比較麻煩一點,不過有人覺得這樣比較好看
一樣見仁見智,我是懶惰的人

加上去之後,還要做討人厭的strong parameter,

這裡不一定要將registration controller給弄出來,

devise一樣提供我們懶人的做法,就是在application controller裡面加入:

    before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :name
  end

接著在對一些post controller做小小的限制,讓沒登入的user不能夠編輯、新增、刪除

before_action :authenticate_user!, only: [:edit, :update, :new, :destroy]

參考資料:https://github.com/plataformatec/devise

這些神奇的helper其實都在devise裡面寫好了,

看一下readme會省下很多工。

現在我們已經有了使用者和po文功能,

明天將會使用bootstrap對現在的外觀做一些調整再繼續。


上一篇
[ Day 14 ][ Review ] Rails Pacific心得 - How to become a senior developer
下一篇
[ Day 16 ] 簡單的美化一下網站 - Bootstrap
系列文
從想法到快速實作的捷徑:Rails30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言